/********************************************
 * 功能说明: 
 * 模块名称: 
 * 系统名称: 
 * 软件版权: 
 * 系统版本: 1.0.0
 * 开发人员: zhangfb
 * 开发时间: 2019/4/3 17:56
 * 审核人员: 
 * 相关文档: 
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.hyacinth.utils;

import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;

import java.lang.reflect.Array;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigInteger;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author zhangfb
 * @version 1.0.0.1
 * @since JDK 1.8
 */
public final class QueryUtils {

    // 原始类
    private static List<Class<?>> PrimitiveClasses = new ArrayList<Class<?>>() {
        private static final long serialVersionUID = -108536773029584914L;
        {
            add(Long.class);
            add(Integer.class);
            add(String.class);
            add(java.util.Date.class);
            add(java.sql.Date.class);
            add(java.sql.Timestamp.class);
        }
    };

    // 返回单一列时用到的handler
    private final static ColumnListHandler columnListHandler = new ColumnListHandler() {
        @Override
        protected Object handleRow(ResultSet rs) throws SQLException {
            Object obj = super.handleRow(rs);
            if (obj instanceof BigInteger)
                return ((BigInteger) obj).longValue();
            return obj;
        }

    };

    // 判断是否为原始类型
    public static boolean isPrimitive(Class<?> cls) {
        return cls.isPrimitive() || PrimitiveClasses.contains(cls);
    }

    /**
     * 结果集处理器
     * @param clzs 结果集类型
     * @return
     */
    public static ResultSetHandler handler(Class ... clzs) {
        String typeName = clzs[0].getTypeName();
        System.out.println(typeName);
        ResultSetHandler handler;
        if (isPrimitive(clzs[0])) {
            handler = columnListHandler;
        } else if(Number.class.equals(clzs[0])) {
            handler = new ScalarHandler();
        } else if (Map.class.equals(clzs[0])) {
            handler = new MapHandler();
        } else if (List.class.equals(clzs[0]) && Map.class.equals(clzs[1])) {
            handler = new MapListHandler();
        } else if (List.class.equals(clzs[0]) && clzs[1].isArray()) {
            handler = new ArrayListHandler();
        } else {
            handler = new BeanListHandler(clzs[0]);
        }
        return handler;
    }

    public static void main(String[] args) {

        System.out.println(handler(List.class, String[].class));
    }
}
